
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>synchronized使用 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>synchronized使用 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">Java中的`synchronized`关键字主要解决了多线程编程中的什么核心问题？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`synchronized`关键字通过确保同一时刻只有一个线程可以执行被保护的代码，解决了多线程环境下共享资源访问时可能出现的数据竞争和不一致性问题，从而保证线程安全性，避免竞态条件（Race Condition）的发生。</div>
          </div>
          <div class="card-source">来源: 基本概念</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">`synchronized`的锁机制是基于什么实现的？当一个线程尝试获取一个已被占用的锁时会发生什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`synchronized`关键字是基于每个Java对象都拥有的监视器锁（Monitor Lock）实现的。当一个线程尝试进入`synchronized`代码块或方法时，它会尝试获取该对象的锁。如果锁已被其他线程持有，则当前线程会被阻塞，直到获取到锁为止。</div>
          </div>
          <div class="card-source">来源: 基本概念</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">除了提供互斥性，`synchronized`关键字还保证了哪个重要的内存特性？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">除了互斥性，`synchronized`还提供了内存可见性。这意味着当一个线程释放锁时，它所做的所有修改对之后获取同一个锁的其他线程都是可见的，这确保了多线程环境下的内存一致性。</div>
          </div>
          <div class="card-source">来源: 实现原理</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">当`synchronized`修饰静态方法和实例方法时，它们获取的锁有何不同？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">当`synchronized`修饰静态方法时，它获取的是类级别的锁（锁对象是类的Class对象），会影响该类的所有实例。当修饰实例方法时，它获取的是对象级别的锁（锁对象是当前实例本身），不同实例对象之间的锁互不干扰。</div>
          </div>
          <div class="card-source">来源: 锁的粒度</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">为了提高性能，在使用`synchronized`时，关于锁的粒度有什么最佳实践？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">最佳实践是尽量减小锁的粒度。避免长时间持有锁，只对必要的代码块进行同步，而不是对整个方法进行同步。这样可以减少线程之间的竞争和阻塞，从而提高程序的并发度和性能。</div>
          </div>
          <div class="card-source">来源: 并发编程注意事项</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">相较于`Lock`锁，`synchronized`在锁的获取上有什么局限性？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`synchronized`在获取锁时是不可中断的。一旦一个线程开始等待一个`synchronized`锁，它就会一直阻塞，直到获取到锁为止，无法响应中断。而`Lock`锁提供了可中断的获取方式（如`lockInterruptibly()`）。</div>
          </div>
          <div class="card-source">来源: 与Lock锁对比比较</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">`synchronized`锁是公平锁还是非公平锁？这意味着什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`synchronized`锁是非公平锁。这意味着它无法保证等待时间最长的线程会优先获得锁，新来的线程有可能“插队”先获得锁。</div>
          </div>
          <div class="card-source">来源: 与Lock锁对比比较</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">分类</div>
          <div class="card-question">在什么情况下，使用`synchronized`可能会成为性能瓶颈？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">分类</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">在高并发情况下，`synchronized`可能会成为性能瓶颈。因为大量线程会因为竞争同一个锁而被阻塞，导致性能下降。此外，其较粗的锁粒度也可能导致不必要的阻塞，影响程序的并发度。</div>
          </div>
          <div class="card-source">来源: 线程安全性与性能</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">当`synchronized`成为性能瓶颈时，文档推荐了哪些优化措施？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">文档推荐了三种优化措施：1. 减小锁的粒度，只同步必要的代码片段。2. 优化共享资源的访问，例如使用更高效的数据结构。3. 使用更高级别的锁机制，如 `java.util.concurrent` 包中提供的 `ReentrantLock`。</div>
          </div>
          <div class="card-source">来源: 线程安全性与性能</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
